#include<iostream>
#include<cstring>
using namespace std;
// zdl:: 到哪覆盖下标中出现相应的负数，我们可以直接使用偏移量的放啊是将这个问题解决
const int m = 5000;
const int N = 1e4 + 10;
int f[1010][N];
int a[1010];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int x, y; cin >> x >> y;
        a[i] = x - y;
    }
    // zdl:: 现在开始使用动态规划的思想来解决这个问题
    memset(f, 0x3f, sizeof f);
    f[0][0 + m] = 0; // 考虑到第二维的数据
    for (int i = 1; i <= n; i++)
    {
        for (int j = -m; j <= m; j++)
        {
            // zdl:: 转或者不转
            f[i][j + m] = min(f[i - 1][j - a[i] + m], f[i - 1][j + a[i] + m] + 1);
        }
    }

    // 现在开始寻找答案
    int ret = 0x3f3f3f3f;
    for (int i = 0; i <= m; i++)
    {
        ret = min(f[n][i + m], f[n][-i + m]);
        if (ret != 0x3f3f3f3f) break;
    }

    cout << ret << endl;
    return 0;
}